ホームに戻る
目次 :

コントロールの操作に関する制約

フォームアプリケーションなどの、コントロール(GUI)を有するアプリケーションにおいて別スレッドを起動した場合、
別スレッドからは直接コントロールを操作することはできない
コントロールの操作はUIスレッドから行う必要がある
画像

UIスレッドとは

各フォームに割り当てられたスレッドで、主にイベントハンドラが属する。
即ち、コントロールの操作は原則として、当該フォームのコンストラクタとイベントハンドラ(およびそれらのサブルーチン)からに限定される
(子フォームを起動した場合も同様。子フォーム(のスレッド)からは親フォームのコントロールを操作することはできない。)

別スレッドからのコントロールの操作

別スレッドからコントロールを操作する場合は、UIスレッドに操作を委譲する必要がある
画像

InvokeRequired

各コントロール(フォームを含む)にはInvokeRequiredというプロパティが存在し、Invoke() の要否( == UIスレッド外からの操作)を判定することができる。
上記のコード例を InvokeRequired を用いて書き直すと以下のようになる。これによりUIスレッド、UIスレッド外を問わず、一つの関数を共用できる。
画像
UpdateLabelText() は自分自身をデリゲートとして渡している。(≒再帰呼び出し)